package reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * Java反射就是在运行状态中，对于任意一个类，都能够知道这个类的所有属性和方法；对于任意一个对象，都能够调用它的任意方法和属性；并且能改变它的属性。
 *
 * 灵活使用反射能让我们代码更加灵活，这里比如JDBC原生代码注册驱动，Spring 的 AOP等等都有反射的实现。但是凡事都有两面性，反射也会消耗系统的性能，增加复杂性等，合理使用才是真！
 */
public class Main {

    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        Class aClass = Class.forName("reflect.User");
        Class bClass = User.class;
        for (Field declaredField : aClass.getDeclaredFields()) {
            System.out.println(declaredField);
        }
        Method[] declaredMethodList = aClass.getDeclaredMethods();
        for (Method declaredMethod : declaredMethodList) {
            System.out.println("declared Method: " + declaredMethod);
        }

        Constructor constructor = aClass.getDeclaredConstructor(String.class,Integer.class);
        constructor.setAccessible(true);
        System.out.println(constructor);

        Object object = constructor.newInstance("demo",12);
        System.out.println(object instanceof User);
        User user = (User) object;
        System.out.println(user.getName());
    }

}
